package genericity;

import org.apache.poi.ss.formula.functions.T;

import java.util.ArrayList;
import java.util.List;

/**
 * https://app.yinxiang.com/shard/s59/nl/27170006/b97906ad-c857-433b-b07f-d283a8b1426c
 */
public class ExampleBracketTTAndT {

}

//    TTDemo ttDemo = new TTDemo();
//    TDemo<String> tDemo = new TDemo<>();


/*
*
* <T> T用法
* 这个<T>T表示的是返回值T是泛型，T是一个占位符，
* 用来告诉编译器，这个东西先给我留若，等我编译的时候，告诉你。

* */
class TTDemo {
    public static void main(String[] args){
        TTDemo ttDemo = new TTDemo();

        // 获取String类型
        List<String> array = new ArrayList<>();
        array.add("aaa");
        array.add("bbb");
        String str =  ttDemo.getListFirst(array);
        System.out.println(str);

        // 获取Number类型
        List<Integer> nums = new ArrayList<>();
        nums.add(1);
        nums.add(2);
        Integer num = ttDemo.getListFirst(nums);
        System.out.println(num);
    }

    /**
     * 这个<T> T可以传入任何类型的List参数T
     * 第一个表示是泛型
     * 第二个表示返回的是T类型的数据第三个限制参数类型为T
     * @param data
     * @param <T>
     * @return
     */
    private <T> T getListFirst(List<T> data){
        if(data == null || data.size() == 0){
            return null;
        }
        return data.get(0);
    }
}

/*
* T用法
* 返回值，直接写T表示限制参数的类型,这种方法一般多用于共同操作一个类对象，然后获取里面的集合信息啥的。
* */
class TDemo<T> {
    public static void main(String[] args){

        // 获取String类型
        TDemo<String> tDemo = new TDemo<>();  // 限制"T"为String类型
        List<String> array = new ArrayList<>();
        array.add("aaa");
        array.add("bbb");
        String str =  tDemo.getListFirst(array);
        System.out.println(str);

        // 获取Number类型
        TDemo<Integer> tDemo1 = new TDemo<>();  // 限制"T"为Integer类型
        List<Integer> nums = new ArrayList<>();
        nums.add(1);
        nums.add(2);
        Integer num = tDemo1.getListFirst(nums);
        System.out.println(num);
    }

    /**
     * 这个只能传递T类型的数据
     * 返回值就是Demo<T>实例化传递的对象类型
     * @param data
     * @return
     */
    private T getListFirst(List<T> data){
        if(data == null || data.size() == 0){
            return null;
        }
        return data.get(0);
    }
}